package StuCouSelectionSystem;

import java.util.Scanner;

public class StuCouSS {

	//建数组对象，数组中每一个元素都是一个待new的对象；
	teacher[] teachers = new teacher[10];   //用来储存输入老师的信息；
	student[] students = new student[10];	//储存输入学生的信息；
	course[] courses = new course[10];		//储存输入课程的信息；
	teacher[] stutea = new teacher[10];		//存放学生选的课的老师的信息；
	course[] stucous = new course[10];		//存放学生选的课的信息；

	Scanner in = new Scanner(System.in);

	private boolean result = false;			//一个布尔型变量，用来判断是否第一次选择了老师身份进行程序；

	private int k;							//输入老师或学生的个数，<10;

	public void printK() {					//一个public方法，得到k值；
		k = in.nextInt();
	}

	public void printInformation() {		//输出每个学生的课表信息；
		for (int i = 0; i < k; i++) {
			System.out.print(i+1+"\t");
			students[i].showStudent();
			stucous[i].showCourse();
			stutea[i].showTeacher();
		}
	}

	public void studentSC() {				//学生输入信息和选课的方法；
		for (int i = 0; i < k; i++) {		//循环学生的个数；
			System.out.println("请依次输入学生" + (i + 1) + "编号，姓名，性别");
			students[i] = new student(in.next(), in.next(), in.next());	//每一个学生new一个对象，输入的信息放在其中
			System.out.println("是否选课 9进入,其他数字退出");
			int num = in.nextInt();
			if (num == 9) {
				while (true) {				//无限循环，目的是学生可以不选课，和如果要选的课没有，也可以重新选择；
					boolean m = false;		//用来跳出while循环的条件
					System.out.println("请输入要选的课的名称或编号");
					String curr;
					curr = in.next();
					if (result) {	/*如果第一次以学生身份进入系统，那么在选课的时候课程和老师的对象还没有创建(new),就会报错null
				为了防止，使用变量result, 如果studentSC()方法比teacherOpenC()方法进行得早，result=false,反之，=true*/
						for (int j = 0; j < k; j++) {        //把老师开始的课一个个与要选的的比较，如果有符合的，就执行
    /* 课程编号或者名称都行*/	        if (curr.equals(courses[j].name) || curr.equals(courses[j].number)) {
								students[i].course = courses[j].name;	//把课程名称放入学生对象的对应变量中
								stucous[i] = new course(courses[j].number, courses[j].name,
										courses[j].place,courses[j].time);
								stutea[i] = new teacher(teachers[j].number,
										teachers[j].name, teachers[j].gender); /*每一个学生new一个对象,使每一个
								学生有独立的空间放数据	*/
								m = true;
							}
						}			//m初始值为false,如果选的课有的话，m=true,就break跳出循环;
						if (m)
							break;
						if (m == false) {  /*如果选的课没有，依然new，因为如果不new，对应的stucous[i]和stutea[i]就
						 								不存在，执行相关数据是会报错*/
							students[i].course = " ";			
							stucous[i] = new course(" ", " ", " ", " ");
							stutea[i] = new teacher(" ", " ", " ");
							System.out.println("没有该课,请重新选择;1退出,其他数字继续选课");
							int r = in.nextInt(); 
							if (r == 1)		//r==1,跳出while循环,其他数字，还在while中，可继续选课；
								break;
						}
					} else {
						System.out.println("老师还未开课");  //如果result=false,就执行;跳出while;
						break;
					}
				}
			} else {						//如果不进入while进行选课，也要new,防止报错；
				students[i].course = " ";
				stucous[i] = new course(" ", " ", " ", " ");
				stutea[i] = new teacher(" ", " ", " ");
			}
			if (result == false) //跳出最外层循环，结束本方法;
				break;
		}

	}

	public void studentDropC(int cnt) {   //学生退课用，把值赋为空格；
		students[cnt - 1].course = " ";
		stucous[cnt - 1].reset();
		stutea[cnt - 1].reset();
	}

	public void teacherOpenC() {        //老师输入信息和开设课的方法
		result = true;					//如果进入本方法，result=true,在studentSC()中就不能选课
		for (int j = 0; j < k; j++) {	//遍历老师
			System.out.println("请依次输入老师" + (j + 1) + "编号，老师姓名，性别");
			teachers[j] = new teacher(in.next(), in.next(), in.next()); //每个老师有一个teacher对象，独立放信息
			System.out.println("7开设课程,其他数字退出");
			int num = in.nextInt();
			if (num == 7) {
				System.out.println("请依次输入编号，课程名称，上课地点和时间");
				courses[j] = new course(in.next(), in.next(), in.next(), in.next()); 
													//把老师与其开设的课一一对应
				System.out.println("已完成");
			}
			else {
				courses[j] = new course(" "," "," "," "); 
			}				//如果老师不开课，也new对于的课，值为空格，防止因为没new而使用对应的courses[j]时而报错
		}
	}

	public void start() {	//本方法为系统整体结构
		for (;;) {	//系统的循环，重新开始后结束
			boolean exit = false; //用来判断结束时是否退出系统或重新开始
			System.out.println("学生选课模拟系统");
			System.out.println("请输入学生人数或课程量");
			printK();              //调用方法，输入k值，k为要输入老师或学生的人数，<10;
			boolean sign = false;  //是否要进行输入学生序号进行退课的条件
			boolean label = true;	//是否要进行学生模式或老师模式的条件
			for (;;) {
				for (;;) {
					boolean mark = false; //是否要跳出本循环的条件
					if (label) {			//label初始值为true,可选择学生或老师模式
						System.out.println("请选择身份，1为学生，2为老师");
						int biu = in.nextInt();

						if (biu == 1) {
							studentSC();
							if (result) {
								mark = true; //进入学生模式后，就要跳出循环
							}
						}
						if (biu == 2) {
							teacherOpenC(); //进入老师模式，不能跳出循环
						}
					}

					if (sign) {				//sign初始值为false,不执行
						System.out.println("请输入学生序号");
						int cnt = in.nextInt();
						studentDropC(cnt);	//调用方法，使对应的信息改变
						sign = false; 		//如果本次循环没跳出，那么下次就不能进入(保险)
						mark = true;		//跳出本次循环的条件
					}
					if (mark) {
						break;				//跳出本次循环
					}
				}    //选完课或退课后执行以下程序
				System.out.println("是否查看课表信息 是或否");
				String decide = in.next();
				if (decide.equals("是")) {
					System.out.println("序号"+"\t"+"学生编号" + "\t" + "姓名" + "\t" + "性别" + "\t" + "课程" + "\t" + "课程编号" + "\t" + "上课地点"
							+ "\t" + "上课时间" + "\t" + "老师姓名" + "\t" + "性别" + "\t" + "编号");
					printInformation();	//输出相关信息
				}

				System.out.println("是否要退课 是或否");
				decide = in.next();
				if (decide.equals("是")) {
					sign = true;	//可进入退课
					label = false;	//不能进行学生或老师模式
				} else {	//如果不退课
					System.out.println("是否退出系统;“是”退出,”否“回到首部");
					decide = in.next();
					if (decide.equals("是")) {
						exit = true;	//退出系统循环的条件
						break;			//先跳出本循环
					} else if (decide.equals("否")) {
						break; //跳出本循环，但不跳出系统循环(最外层循环)
					}
				}
			}
			if (exit)
				break;	//跳出最外层循环，结束程序；
		}
	}

	public static void main(String[] args) {
		StuCouSS css = new StuCouSS();	//new一个对象
		css.start();					//调用对象中的方法；
	}
}



class Data {          //父类
	 String number;
	 String name;
	 String gender;
	 String course;
	
	public Data(String number,String name,String gender) {
		this.number = number;
		this.name = name;
		this.gender = gender;
	}
	public Data(String number,String name) {
		this.number = number;
		this.name = name;
	}
}

class teacher extends Data {			

	public teacher(String number, String name, String gender) { 
		super(number,name,gender);    //传值给父类，使继承得到的元素初始化
	}

	public void showTeacher() {	
		System.out.println(name + "\t" + gender + "\t" + number);

	}

	public void reset() {	
		this.number = " ";
		this.name = " ";
		this.gender = " ";
		this.course = " ";
	}

}

class student extends Data {			

	public student(String number, String name, String gender) {
		super(number,name,gender);	//同上
	}

	public void showStudent() {
		System.out.print(number + "\t" + name + "\t" + gender + "\t" + course + "\t");
	}
}

class course extends Data {       	//同上
	String place;
	String time;

	public course(String number, String name, String place, String time) {
		super(number,name);
		this.place = place;
		this.time = time;
	}

	public void showCourse() {
		System.out.print(number + "\t" + place + "\t" + time + "\t");

	}

	public void reset() {
		this.number = " ";
		this.name = " ";
		this.place = " ";
		this.time = " ";
	}

}
